/**
 * 这里主要测试最常见的rust数据类型，这些类型包括:
 * 元组
 * 数组
 * 枚举
 * 向量
 * String
 * map
 * 结构(struct)
 * ----------------------------------------------------
 * 主要是要归纳它们的一些共性：读写、传参、所有权转移等。
 * 最后会归纳为几条和若干的表格
 * 
 */
//#![feature(tuple_trait_v2)]
 fn main() {
   test_tuple();
 }

 fn test_tuple(){
    //1.0 定义，根据书上描述是定长，同时允许每个元素具有不同的类型
    let mut  tup: (i32, f64, u8) = (500, 6.4, 1);
    //1.1 解构赋值
    let (x, y, z) = tup;
    println!("{} {} {}", x, y, z);
    //1.2 直接访问，通过索引访问，索引从0开始计数
    println!("{}", tup.0);


    //2.0 扩展一个元组，使用.扩展运算符
    //tup.extend([(7,12.5,22),(99,920.3,10)]);
    println!("{:?}", tup);
    //2.1 extend方-- fn extend<T>(&mut self, into_iter: T)
    // where  T: IntoIterator<Item = (A,)>,  
    // 即要求加入参数必须是迭代器，且迭代器的元素要和元组类型一致，否则编译不通过
    // 此外，元组的成员必须是实现了extend的trait，否则编译不通过。换言之，必须成员是Vec这样的
    //扩展成员是元组的
    let mut tup2 = (vec![1], vec![6]);
    tup2.extend([(7,8), (10,12)]);  //仔细看，通常整体是数组，然后每个成员都是元组，每个元组的成员数必须和原来的一致
                                    //但数组的个数并没有特别限制
    tup2.extend([(7,8), (10,12),(99,88)]);
    println!("{:?}", tup2);

    //3.0 元组比较  ,好像没有什么特别的意思，就是普通的比较逻辑
    // cmp 返回一个Ordering枚举，即Less, Equal, Greater
    
    let tup3 = (vec![1,3,4],vec![5,6,7]);
    let tup4 = (vec![1,3,4],vec![5,6,7]);
    let tup5 = (vec![1,3,4,10],vec![5,6,7]);
    let cr=tup3.cmp(&tup4);
    println!("{:?}", cr);   //相等的比较结果为Equal
    let cr2=tup3.cmp(&tup5);
    println!("{:?}", cr2);
    
 }